在自動化測試開發中,Flaky Test 一直是讓人頭痛的問題,明明沒有改測試腳本,開發也沒有部署新的版本,但是測試有時候通過、有時候失敗,或是在我的電腦跑成功,怎麼上雲之後有時候成功有時候失敗,這種惱人的問題相信開發自動化的夥伴的肯定都有切身之痛,無法追到的原因只可以甩鍋給網路問題,然而 Flaky Test 導致的測試結果不穩定因此難以識別真實的軟體問題,進而影響整個開發流程,在本章節中,我們將會介紹該如何透過 Appium 的 Wait 關鍵字來提高我們測試的穩定度。
Flaky Test 指的是,在相同的條件或是相同的程式碼下,執行測試時有時候會 pass 有時候會 fail 的測試結果不穩定,這使得測試人員需要花時間查看測試原因或是重新執行測試,頻繁的誤報也容易導致開發團隊對於自動化的測試不信任,讓測試的效益大打折扣。
Flaky Test 的成因多種多樣,但常見的原因通常與以下幾點有關:
我們可以透過些手段來減少 Flaky Test:
wait
關鍵字提高測試穩定度在上面我們提到了不穩定的 UI 元件這個因素,這個部分是我們相對容易掌控的,使用適當的等待機制是提高測試穩定度的重要方法之一,有時候是因為 UI 載入比較慢,或是網路比較慢導致我們在執行下一個步驟的時候 UI 還沒有渲染完成,因此造成點不到元件的情況發生,這時候我們可以透過 AppiumLibrary 提供的 wait 的 keyword 來進行等待,當頁面上出現指定元件時才進行下一步,如此一來可以大大提升測試的穩定性。
這時候大家可能會想說,在前面的 Playwright 我們沒有提到這個概念呀,而且 Web 測試明明跑更快,應該很常發生腳本比瀏覽器快的問題呀!沒錯,確實是這樣,之所以不需要等待的原因是因為 Playwright 的內建自動等待機制,Playwright 提供以下兩種等待機制,替我們提升了測試的穩定性。
click
, type
, fill
等)時,Playwright 會自動等待目標元件變得可見、可操作並且沒有被遮擋。這意味著,如果元件在頁面上尚未加載完畢,Playwright 會自動等待,直到可以對該元件進行操作。為了應對 Flaky Test,AppiumLibrary 雖然不像 Playwright 直接內建了等待的功能,但是提供了多種 wait
關鍵字,可以幫助我們客製化更靈活的處理測試中的異步操作和不穩定因素。
以下是一些常用的 wait
關鍵字及其應用場景:
Wait Until Element Is Visible
等待某個元件在畫面上可見:這個關鍵字會在指定時間內不斷檢查目標元件是否可見,若在指定時間內元件未出現,測試將失敗。
Wait Until Element Is Visible //button[@text='Submit'] 10s
Wait Until Page Contains
等待整個頁面包含指定的文字:此關鍵字用於確保頁面上的特定文字已加載,特別適合處理頁面加載時間不穩定的情況。
Wait Until Page Contains Login Successful 10s
Wait Until Element Is Enabled
等待某個元件可操作(即元件被啟用):該關鍵字適用於等待某個按鈕或輸入框變為可用狀態,避免因為過早操作而導致的測試失敗。
Wait Until Element Is Enabled id=submitButton 5s
Wait Until Page Does Not Contain Element
等待某個元件從頁面上消失,適合用來等待加載動畫或其他暫時性元件的消失,以確保頁面已完全加載,例如:點擊除存後會出現儲存中轉圈圈的畫面,我們可以等到圈圈轉完才進行下一個步驟。
Wait Until Page Does Not Contain Element //div[@id='loading'] 10s
假設今天有個情境是,當今天五秒內畫面出現優惠卷的話,我們就點擊優惠卷,如果沒有則不點擊這樣的情境下,我們便可以透過下方的 Code 來執行,透過當前畫面元件的顯示狀態來決定下一個步驟的執行與否:
${is_visible}= Run Keyword And Return Status Wait Until Element Is Visible //button[@text='ticket'] 5s
Run Keyword If '${is_visible}'=='True' Click Button //button[@text='get']
Flaky Test 是測試自動化過程中的一大挑戰,但通過了解其成因並採取相應的策略,我們可以大幅提高測試的穩定性。使用 AppiumLibrary 的 wait
關鍵字是一個行之有效的方法,能幫助我們應對不穩定的測試場景,從而確保測試結果的可靠性。